// 设置统一的请求拦截器


import {useUserStore} from "@/stores/user";
import type {ApiDataType} from "@/types/global";

/**
 * 拦截类型
 * request/uploadFile
 * 拦截内容
 * 1、补全url域名等前缀信息
 * 2、添加请求来源和认证信息的header
 * 3、处理请求成功的情况
 *  3.1、提取接口的数据内容并返回
 *  3.2、根据接口code处理认证过期等特殊错误的情况
 *  3.3、对常规错误code直接响应输出提示语
 * 4、处理请求失败的情况
 *  4.1、http响应码为4xx时提示资源不存在
 *  4.2、http响应码为5xx时提示
 */

// const baseUrl = 'https://apifoxmock.com/m1/4912465-4569237-default/mock'
const baseUrl = 'http://localhost:8089'
// const baseUrl = 'http://127.0.0.1:4523/m1/4912465-4569237-default'
const intercepterOption: UniApp.InterceptorOptions = {
    invoke(options: UniApp.RequestOptions) {
        if (!options.url.startsWith('http')) {
            options.url = baseUrl + options.url
        }
        options.timeout = 5000
        options.header = {
            ...options.header,
            'source-client': 'miniapp',
        }
        console.log("@http invoke===================")
        const memberStore = useUserStore()
        const token = memberStore.getToken()
        if (token) {
            // options.header.Authorization = token
            // 使用apifoxToken
            options.header.Authorization = "Bearer " + token
        }
    },
}

uni.addInterceptor('request', intercepterOption)
uni.addInterceptor('uploadFile', intercepterOption)

// 封装一个处理接口调用的请求工具类

export const request = <T>(options: UniApp.RequestOptions) => {
    return new Promise<ApiDataType<T>>((resolve, reject) => {
        // 执行请求
        uni.request({
            ...options,
            //
            /**
             * 统一处理请求响应成功后的操作，返回接口中的数据，不包括判断错误码
             * 网络响应成功，但是http code可能不是200
             * @param result
             */
            success(result) {
                if (result.statusCode >= 500) {
                    uni.showToast({
                        title: '服务错误',
                        icon: 'error',
                    })
                    return reject('服务错误')
                }
                if (result.statusCode >= 400) {
                    uni.showToast({
                        title: '系统异常',
                        icon: 'error',
                    })
                    return reject('系统异常')
                }
                // 特殊处理apifox的mock错误
                if (Object.hasOwn(<Object>result.data, "apifoxError")) {
                    uni.showToast({
                        title: "接口不存在，请检查",
                        icon: "none"
                    })
                    return reject({
                        code: 0,
                        msg: "接口不存在，请检查"
                    })
                }
                const rs = result.data as ApiDataType<T>
                if (rs.code === 0) {
                    return resolve(rs)
                }
                // 对一些特殊的错误码做额外处理
                if (rs.code === 1003004 || rs.code === 1003001) {
                    // 清理token信息
                    const memberStore = useUserStore()
                    memberStore.logout()
                    uni.navigateTo({
                        url: "/pagesLogin/settings/login"
                    })
                }
                return reject(rs)
            },
            // 网络响应失败，可能域名不存在或网络断开
            fail(err) {
                console.log("@request fail: ", err)
                uni.showToast({
                    title: '换个网络试试吧',
                    icon: 'error',
                })
                return reject('网络错误')
            },
        })
    })
}
